#include <iostream>
#include <queue>

using namespace std;

const int N = 1e4 + 10;

typedef long long LL;

int n, m;
LL a[N], b[N], c[N];

//1.仅需将x=1的所有函数值计算出来
//	然后每次拿出最小的那个，把对应的下一个函数值再计算出来

//<函数值，函数编号，代入值>
struct node
{
	LL f, num, x;

	//按照函数值比较大小
	bool operator<(const node& x) const
	{
		return f > x.f; // 小根堆，大元素下坠
	}
};

priority_queue<node> heap;

LL calc(int i, int x)
{
	return a[i] * x * x + b[i] * x + c[i];
}

int main()
{
	cin >> n >> m;
	for(int i = 1; i <= n; i++) cin >> a[i] >> b[i] >> c[i];

	//1.把x=1的值放入堆中
	for(int i = 1; i <= n; i++)
	{
		heap.push({calc(i, 1), i, 1});
	}

	//2.依次拿出m个值
	while(m--)
	{
		auto t = heap.top(); heap.pop();
		LL f = t.f, num = t.num, x = t.x;
		cout << f << " ";

		//计算下一个函数值
		heap.push({calc(num, x + 1), num, x + 1});
	}


	return 0;
}
